package net.blank.ui
{
	import net.blank.blankLoader.SequenceLoader;
	
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
	import flash.net.LocalConnection;
	import flash.utils.Dictionary;
	
	/**
	 * 系统管理
	 * @author blank
	 * 
	 */
	public class SystemManager
	{
		/**
		 * 整个程序的容器
		 */
		private var _application:DisplayObjectContainer;
		
		/**
		 * 序列化加载器
		 */
		private var _sequenceLoader:SequenceLoader;
		
		/**
		 * url地址内容缓存器
		 */
		private var _urlCache:Dictionary;
		
		/**
		 * 静态实例
		 */
		private static var $instance:SystemManager;
		
		/**
		 * 是否调试模式
		 */
		private static var _isDebug:Boolean;
		
		/**
		 * 系统管理
		 * 
		 */
		public function SystemManager(){
			if ($instance){
				throw new Error("只能用getInstance()来获取实例!");
			}
		}
		
		/**
		 * 初始化
		 * @param application 整个程序的容器,一般指定为 stage
		 * 
		 */
		public function init(application:DisplayObjectContainer,sequenceLoader:SequenceLoader=null,urlCache:Dictionary=null):void{
			_application = application;
			_sequenceLoader=sequenceLoader || new SequenceLoader();
			_urlCache=urlCache || new Dictionary(true);
			
			//如果能使用trace,则表示当前文件为 debug 版SWF.
			trace(
				_isDebug=true,
				application.addEventListener(
					MouseEvent.CLICK,
					function(evt:MouseEvent):void{
						evt.target;
					}
				)
			);
			
			return;
		}
		
		/**
		 * 整个程序的容器( init 方法指定)
		 * @return 
		 * 
		 */
		public function get application():DisplayObjectContainer{
			if(_application){
				return _application;
			}
			throw new Error("必须先对此实例进行初始化!(调用 init 方法)");
		}
		
		/**
		 * 序列化加载器
		 * @return 
		 * 
		 */
		public function get sequenceLoader():SequenceLoader{
			return _sequenceLoader;
		}
		
		/**
		 * url地址内容缓存器(如不在 init 方法中定义,则默认使用弱引用,以保证在内存回收周期内能被垃圾回收器回收掉)
		 * @return 
		 * 
		 */
		public function get urlCache():Dictionary{
			return _urlCache;
		}
		
		/**
		 * 是否调试模式
		 * @return 
		 * 
		 */
		public function get isDebug():Boolean{
			if(!_application){
				throw new Error("必须先对此实例进行初始化!(调用 init 方法)");
			}
			
			return _isDebug;
		}
		
		/**
		 * 通过引发异常来触发系统GC(内存回收)
		 * 
		 */
		public static function gc() : void{
			var lc1:LocalConnection = new LocalConnection();
			var lc2:LocalConnection = new LocalConnection();
			try{
				lc1.connect("gc");
				lc2.connect("gc");
			}
			catch (err:Error){}
		}
		
		/**
		 * 获取静态实例
		 * @return 
		 * 
		 */
		public static function getInstance():SystemManager{
			if (!$instance){
				$instance = new SystemManager;
			}
			return $instance;
		}
	}
}